package net.wang.concurrency.test.singleton;


import net.wang.concurrency.annoations.NotThreadSafe;

/**
 * 单例模式——懒汉模式 双重同步锁  实例实在第一次使用时创建
 * 线程是不安全的
 */
@NotThreadSafe
public class SingletonExample4 {

    private SingletonExample4() {

    }

    private static SingletonExample4 instance = null;

    /**
     * 线程不是安全的,会发生指令重排
     *
     * @return
     */
    public static SingletonExample4 getInstance() {
        if (instance == null) { //双重检测机制
            synchronized (SingletonExample4.class) {
                if (instance == null) {
                    instance = new SingletonExample4(); //这行代码实际执行过程中会分为 instance 分配内存空间和创建对象2步，JVM和CPU优化可能会调换这两步的顺序
                }
            }
        }
        return instance;
    }
}
